/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ndj.daoimpl;

import br.com.ndj.conexao.FabricaConexao;
import br.com.ndj.dao.VersaoDoSqlServerDAO;
import br.com.ndj.domain.VersaoDoSqlServer;
import br.com.ndj.exceptions.FabricaConexaoPoolVazioException;
import br.com.ndj.exceptions.VersaoDoSqlServerDAOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Osmar Vilarim
 * 18/09/2014
 */

public class VersaoDoSqlServerDAOImpl implements VersaoDoSqlServerDAO {
    
    private Connection conn = null;
    private String sql = "";
    private PreparedStatement pstmt = null;
    private List<VersaoDoSqlServer> listVersaoDoSqlServer = new ArrayList<VersaoDoSqlServer>();
    
    
    public VersaoDoSqlServerDAOImpl() {
        try {
            //conn = new FabricaConexao().abrirConexao();
            conn = FabricaConexao.getInstance().getConnectionFromPool();
        } catch (FabricaConexaoPoolVazioException ex) {
            //Logger.getLogger(LoginDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public boolean cadastrarVersaoDoSqlServer(VersaoDoSqlServer versaoDoSqlServer) throws VersaoDoSqlServerDAOException{
        boolean retorno = false;

        if (versaoDoSqlServer != null) {

            try {

                conn.setAutoCommit(false);
                sql = "INSERT INTO ver_versao_do_sql_server (VER_NOME) VALUES (?)";
                pstmt = conn.prepareStatement(sql);

                pstmt.setString(1, versaoDoSqlServer.getVerNome().trim());
                
                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                }
                conn.commit();
                pstmt.close();

                retorno = true;
            } catch (SQLException e) {

                try {
                    conn.rollback();
                } catch (SQLException x) {
                    throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_INSERIR_VERSAO, null);
                }

                throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_INSERIR_VERSAO, null);
            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }

        }

        return retorno;
    }

    @Override
    public boolean editarVersaoDoSqlServer(VersaoDoSqlServer versaoDoSqlServer) throws VersaoDoSqlServerDAOException {
         boolean retorno = false;

        if (versaoDoSqlServer != null) {

            try {
                conn.setAutoCommit(false);
                sql = "";
                sql = "UPDATE ver_versao_do_sql_server SET VER_NOME = ? WHERE VER_IDENTIFICADOR = ?";

                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, versaoDoSqlServer.getVerNome());
                pstmt.setInt(2, versaoDoSqlServer.getVerIdentificador());

                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                    retorno = true;
                }
                conn.commit();
                pstmt.close();

            } catch (SQLException ex) {
                
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_ALTERAR_VERSAO, null);
                }
                
                throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_ALTERAR_VERSAO, null);

            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }
        }
        return retorno;
    }

    @Override
    public boolean excluirVersaoDoSqlServer(VersaoDoSqlServer versaoDoSqlServer) throws VersaoDoSqlServerDAOException {
        boolean retorno = false;

        try {

            if (versaoDoSqlServer.getVerIdentificador()!= 0) {
                sql = "DELETE FROM ver_versao_do_sql_server where VER_IDENTIFICADOR = ?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, versaoDoSqlServer.getVerIdentificador());
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        try {

            conn.setAutoCommit(false);

            int rows = pstmt.executeUpdate();

            if (rows > 0) {
                System.out.println("Quantidade de linhas excluídas no banco: " + rows);
            }
            conn.commit();
            pstmt.close();

            retorno = true;
        } catch (SQLException e) {

            try {
                conn.rollback();
            } catch (SQLException e1) {
                throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_EXCLUIR_VERSAO, null);
            }

            throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_EXCLUIR_VERSAO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return retorno;
    }

    @Override
    public List<VersaoDoSqlServer> listarVersaoDoSqlServer() throws VersaoDoSqlServerDAOException {
        listVersaoDoSqlServer = new ArrayList<VersaoDoSqlServer>();
        
        try {
            sql = "SELECT VER_IDENTIFICADOR, VER_NOME FROM ver_versao_do_sql_server";
            pstmt = conn.prepareStatement(sql);

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                VersaoDoSqlServer versaoDoSqlServer = new VersaoDoSqlServer();
                
                versaoDoSqlServer.setVerIdentificador(rs.getInt("VER_IDENTIFICADOR"));
                versaoDoSqlServer.setVerNome(rs.getString("VER_NOME"));
  
                this.listVersaoDoSqlServer.add(versaoDoSqlServer);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_LISTAR_VERSAO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listVersaoDoSqlServer;
    }

    
    @Override
    public List<VersaoDoSqlServer> listarVersaoDoSqlServer(VersaoDoSqlServer versaoDoSqlServer) throws VersaoDoSqlServerDAOException {
        listVersaoDoSqlServer = new ArrayList<VersaoDoSqlServer>();
        
        try {

            sql = "SELECT VER_IDENTIFICADOR,VER_NOME FROM ver_versao_do_sql_server  where VER_NOME like ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "%"+versaoDoSqlServer.getVerNome()+"%");

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                versaoDoSqlServer = new VersaoDoSqlServer();
                
                versaoDoSqlServer.setVerIdentificador(rs.getInt("VER_IDENTIFICADOR"));
                versaoDoSqlServer.setVerNome(rs.getString("VER_NOME"));
                
                this.listVersaoDoSqlServer.add(versaoDoSqlServer);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_LISTAR_VERSAO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listVersaoDoSqlServer;
    }

    @Override
    public VersaoDoSqlServer consultarVersaoDoSqlServer(VersaoDoSqlServer versaoDoSqlServer) throws VersaoDoSqlServerDAOException {

        try {

            sql = "SELECT VER_IDENTIFICADOR,VER_NOME FROM ver_versao_do_sql_server  where VER_IDENTIFICADOR = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "%"+versaoDoSqlServer.getVerIdentificador()+"%");

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                versaoDoSqlServer = new VersaoDoSqlServer();
                
                versaoDoSqlServer.setVerIdentificador(rs.getInt("VER_IDENTIFICADOR"));
                versaoDoSqlServer.setVerNome(rs.getString("VER_NOME"));
                
            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new VersaoDoSqlServerDAOException(VersaoDoSqlServerDAOException.ERRO_CONSULTAR_VERSAO, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return versaoDoSqlServer;
    }

}
